/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gui;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import obliczenia.Algorytm;
import obliczenia.DualnyAlgorytm;
import obliczenia.Obliczenia;

/**
 *
 * @author Darek
 */
public class Gui extends javax.swing.JFrame {

    ArrayList<JTextField> textFields = new ArrayList<JTextField>();
    Obliczenia obliczenia = new Obliczenia();
    /**
     * Creates new form GUI
     */
    public Gui() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        tytulLabel = new javax.swing.JLabel();
        liczbaWierszyTextField = new javax.swing.JTextField();
        wierszeLabel = new javax.swing.JLabel();
        liczbaKolumnTextField = new javax.swing.JTextField();
        kolumnyLabel = new javax.swing.JLabel();
        tabelaPanel = new javax.swing.JPanel();
        rozwiazanieLabel = new javax.swing.JLabel();
        rozwiazanieScrollPane = new javax.swing.JScrollPane();
        rozwiazanieTextArea = new javax.swing.JTextArea();
        rozwiazButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        tytulLabel.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        tytulLabel.setText("Teoria podejmowania decyzji - Zadanie 2");

        liczbaWierszyTextField.setText("3");
        liczbaWierszyTextField.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        liczbaWierszyTextField.getDocument().addDocumentListener(new LiczbaWierszyTextFieldActionListener());

        wierszeLabel.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        wierszeLabel.setText("wiersze");

        liczbaKolumnTextField.setText("6");
        liczbaKolumnTextField.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        liczbaKolumnTextField.getDocument().addDocumentListener(new LiczbaKolumnTextFieldActionListener());

        kolumnyLabel.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        kolumnyLabel.setText("kolumny");

        tabelaPanel.setSize(700, 480);
        tabelaPanel.setPreferredSize( new Dimension( 700, 480 ) );
        tabelaPanel.setMinimumSize( new Dimension( 700, 480 ) );
        
        initializeJPanelGridLayout(liczbaWierszyTextField, liczbaKolumnTextField);

        rozwiazanieLabel.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        rozwiazanieLabel.setText("Rozwiązanie:");

        rozwiazanieTextArea.setColumns(20);
        rozwiazanieTextArea.setRows(5);
        rozwiazanieScrollPane.setViewportView(rozwiazanieTextArea);

        rozwiazButton.setText("Rozwiąż");
        rozwiazButton.addActionListener(new RozwiazActionListener());

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(228, 228, 228)
                .addComponent(tytulLabel)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(rozwiazanieScrollPane))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(tabelaPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(rozwiazButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addGap(285, 285, 285)
                                .addComponent(liczbaWierszyTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(wierszeLabel)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(liczbaKolumnTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(kolumnyLabel))
                            .addGroup(layout.createSequentialGroup()
                                .addContainerGap()
                                .addComponent(rozwiazanieLabel)))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(tytulLabel)
                .addGap(15, 15, 15)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(liczbaWierszyTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(wierszeLabel)
                    .addComponent(liczbaKolumnTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(kolumnyLabel))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(tabelaPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(rozwiazButton))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(rozwiazanieLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(rozwiazanieScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Gui().setVisible(true);
            }
        });
    }
    
    public void initializeJPanelGridLayout(JTextField liczbaWierszyTextField, JTextField liczbaKolumnTextField){
    	tabelaPanel.removeAll();
    	GridLayout tabelaLayout = new GridLayout(Integer.parseInt(liczbaWierszyTextField.getText()), Integer.parseInt(liczbaKolumnTextField.getText()), 20, 20);
        tabelaPanel.setLayout(tabelaLayout);
        String [] tabela = {"-4", "-3", "-2", "-1", "0", "1", "-2", "1", "4", "4", "1", "-2", "2", "1", "0", "-1", "-2", "-3"};
        textFields.clear();
        if(Integer.parseInt(liczbaKolumnTextField.getText()) == 6 && Integer.parseInt(liczbaWierszyTextField.getText()) == 3){
        	for(int i = 0; i < 18 ; i++){
        		JTextField text = new JTextField(tabela[i]);
            	text.setHorizontalAlignment(SwingConstants.CENTER);
            	textFields.add(text);
        	}
        }
        else{
        	for(int i = 0; i < Integer.parseInt(liczbaKolumnTextField.getText()) * Integer.parseInt(liczbaWierszyTextField.getText()); i++){
            	JTextField text = new JTextField("0");
            	text.setHorizontalAlignment(SwingConstants.CENTER);
            	textFields.add(text);
            }
        }
        
        for(int i =0; i < textFields.size(); i++)
        	tabelaPanel.add(textFields.get(i));
        tabelaPanel.revalidate();
        tabelaPanel.repaint();
    }
    
    public ArrayList<Double> translacjaArrayListyJTextField(){
    	ArrayList<Double> wartosci = new ArrayList<Double>();
    	for( int i = 0; i < textFields.size(); i++){
    		wartosci.add(Double.parseDouble(textFields.get(i).getText()));
    	}
    	return wartosci;
    }
    
    public void warning(JTextField textField){
	    if (Integer.parseInt(textField.getText())<2 || Integer.parseInt(textField.getText())>10){
	        JOptionPane.showMessageDialog(null,
	                "Podaj liczbę z zakresu pomiędzy 2, a 10", "Wprowadzono złą wartość",
	                JOptionPane.ERROR_MESSAGE);
	    }    
	    else{
    		initializeJPanelGridLayout(liczbaWierszyTextField, liczbaKolumnTextField);
	    }
	}
    
    public void wyswietlTabeleZUsunietymiDominantami(ArrayList<Double> tabela, ArrayList<Integer> wiersze, ArrayList<Integer> kolumny, int liczbaWierszy, int liczbaKolumn){
    	rozwiazanieTextArea.removeAll();
    	if(wiersze != null && wiersze.size()!=0 && kolumny != null && kolumny.size() != 0){
    		for(int i = 0; i<wiersze.size(); i++)
    			wiersze.set(i, wiersze.get(i) + 1);
    		for(int i = 0 ; i< kolumny.size(); i++)
    			kolumny.set(i, kolumny.get(i) + 1);
    		rozwiazanieTextArea.append("Usunięto następujące numery zdominowanych wierszy: " + wiersze + " oraz kolumny: " + kolumny + "\n");
    	}
    	else if(wiersze != null && wiersze.size()!=0){
    		for(int i = 0; i<wiersze.size(); i++)
    			wiersze.set(i, wiersze.get(i) + 1);
    		rozwiazanieTextArea.append("Usunięto następujące zdominowane wiersze: " + wiersze + "\n");
    	}
    	else if(kolumny != null && kolumny.size() != 0){
    		for(int i = 0 ; i< kolumny.size(); i++)
    			kolumny.set(i, kolumny.get(i) + 1);
    		rozwiazanieTextArea.append("Usunięto następujące zdominowane kolumny: " + kolumny + "\n");
    	}
    	else{
    	rozwiazanieTextArea.append("Nie znaleziono zdominowanych kolumn oraz wierszy, tabela wypłat pozostaje bez zmian\n");
    	}
    	if((wiersze != null && wiersze.size()!=0) || (kolumny != null && kolumny.size() != 0)){
    		rozwiazanieTextArea.append("Nowa rozpatrywana tabela wygląda następująco:\n");
    		for(int i = 0; i < liczbaWierszy; i++){
    			for(int j = 0 ; j< liczbaKolumn ; j++){
    				rozwiazanieTextArea.append(tabela.get(i * liczbaKolumn + j) + "  ");
    			}
    			rozwiazanieTextArea.append("\n");
    		}
    	}
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel kolumnyLabel;
    private javax.swing.JTextField liczbaKolumnTextField;
    private javax.swing.JTextField liczbaWierszyTextField;
    private javax.swing.JButton rozwiazButton;
    private javax.swing.JLabel rozwiazanieLabel;
    private javax.swing.JScrollPane rozwiazanieScrollPane;
    private javax.swing.JTextArea rozwiazanieTextArea;
    private javax.swing.JPanel tabelaPanel;
    private javax.swing.JLabel tytulLabel;
    private javax.swing.JLabel wierszeLabel;
    // End of variables declaration//GEN-END:variables

class LiczbaWierszyTextFieldActionListener implements DocumentListener{
	@Override
	public void changedUpdate(DocumentEvent e) {
		// TODO Auto-generated method stub
		warning(liczbaWierszyTextField);
	}

	@Override
	public void insertUpdate(DocumentEvent e) {
		// TODO Auto-generated method stub
		warning(liczbaWierszyTextField);        		
	}

	@Override
	public void removeUpdate(DocumentEvent e) {
		// TODO Auto-generated method stub		
	}	
}

class LiczbaKolumnTextFieldActionListener implements DocumentListener{
	@Override
	public void changedUpdate(DocumentEvent e) {
		// TODO Auto-generated method stub
		warning(liczbaKolumnTextField);
	}

	@Override
	public void insertUpdate(DocumentEvent e) {
		// TODO Auto-generated method stub
		warning(liczbaKolumnTextField);        		
	}

	@Override
	public void removeUpdate(DocumentEvent e) {
		// TODO Auto-generated method stub		
	}	
}

class RozwiazActionListener implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent e) {
		int liczbaKolumn = Integer.parseInt(liczbaKolumnTextField.getText());
		int liczbaWierszy = Integer.parseInt(liczbaWierszyTextField.getText());
		ArrayList<Integer> wierszeZdominowane = obliczenia.sprawdzDominacjeWierszy(translacjaArrayListyJTextField(), liczbaWierszy, liczbaKolumn);
		ArrayList<Integer> kolumnyZdominowane = obliczenia.sprawdzDominacjeKolumn(translacjaArrayListyJTextField(), liczbaWierszy, liczbaKolumn);
		ArrayList<Double> nowaTabela = translacjaArrayListyJTextField();
		if(wierszeZdominowane != null && wierszeZdominowane.size()!=0){
			nowaTabela = obliczenia.zamienWierszeZdominowane(translacjaArrayListyJTextField(), wierszeZdominowane, liczbaKolumn, liczbaWierszy);
			liczbaWierszy = liczbaWierszy - wierszeZdominowane.size();
		}
		if(kolumnyZdominowane != null && kolumnyZdominowane.size()!=0){
			nowaTabela = obliczenia.zamienKolumnyZdominowane(translacjaArrayListyJTextField(), kolumnyZdominowane, liczbaKolumn, liczbaWierszy);
			liczbaKolumn = liczbaKolumn - kolumnyZdominowane.size();
		}
		nowaTabela = obliczenia.usunWierszeIKolumnyZdominowane(nowaTabela);
		wyswietlTabeleZUsunietymiDominantami(nowaTabela, wierszeZdominowane, kolumnyZdominowane, liczbaWierszy, liczbaKolumn);
		ArrayList<Double> tabelaMinimow = obliczenia.obliczTabeleMinimow(nowaTabela, liczbaWierszy, liczbaKolumn);
		ArrayList<Double> tabelaMaksow = obliczenia.obliczTabeleMaksow(nowaTabela, liczbaWierszy, liczbaKolumn);
		ArrayList<Double> minima = obliczenia.obliczMinimum(tabelaMinimow);
		ArrayList<Double> maxima = obliczenia.obliczMinimum(tabelaMaksow);
		double minimum = minima.get(0);
		double maksimum = maxima.get(0);
		System.out.println(minimum + " " +maksimum);
		ArrayList<Double> tabelaTransponowana = obliczenia.transponujTabele(nowaTabela, liczbaWierszy, liczbaKolumn);// w tabeli transponowanej liczba wierszy to liczba kolumn i na odwrót
		double[][] tabWarunkow=new double[liczbaWierszy][liczbaKolumn];
		nowaTabela = obliczenia.dodajUjemneWartosciNormalnaTabela(nowaTabela, liczbaWierszy, liczbaKolumn);
		tabelaTransponowana = obliczenia.dodajUjemneWartosciTransponowanaTabela(tabelaTransponowana, liczbaKolumn, liczbaWierszy);
		for(int i = 0; i < liczbaWierszy ; i++){
			for(int j = 0; j < liczbaKolumn ; j++){
				tabWarunkow[i][j] = nowaTabela.get(i * liczbaKolumn + j);
			}
		}
		
		double[] tabWartosci = new double[liczbaWierszy];
		double[] tabFCelu = new double[liczbaKolumn];
		double[][] tabWarunkow2=new double[liczbaKolumn][liczbaWierszy];
		double[] tabWartosci2 = new double[liczbaKolumn];
		double[] tabFCelu2 = new double[liczbaWierszy];
		for(int i = 0; i < liczbaWierszy; i++){
			tabWartosci[i] = 1.0;
			tabFCelu2[i] = 1.0;
		}
		for(int i = 0; i < liczbaKolumn ; i++){
			tabFCelu[i] = 1.0;
			tabWartosci2[i] = 1.0;
		}
		for(int i = 0; i < liczbaKolumn ; i++){
			for(int j = 0; j < liczbaWierszy ; j++){
				tabWarunkow2[i][j] = tabelaTransponowana.get(i * liczbaWierszy + j);
			}
		}
		if(minimum == maksimum){
			rozwiazanieTextArea.append("\n Znaleziono punkt siodłowy, najlepszymi strategiami są: " +minima.get(1)+ " dla gracza A, oraz " +maxima.get(1) + " dla gracza B, rozwiązanie wynosi: " + minimum);
		}
		else{
			rozwiazanieTextArea.append("\nRozwiązanie dla gracza A:\n");
			DualnyAlgorytm f2 = new DualnyAlgorytm(liczbaKolumn, liczbaWierszy);
			f2.wpisz(tabWarunkow2, tabWartosci2, tabFCelu2, liczbaKolumn, liczbaWierszy);
			rozwiazanieTextArea.append(f2.simpTable(liczbaKolumn+2, liczbaKolumn+liczbaWierszy+2));
			rozwiazanieTextArea.append("\n\nRozwiązanie dla gracza B:\n");
			Algorytm f = new Algorytm(liczbaWierszy, liczbaKolumn);
			f.wpisz(tabWarunkow, tabWartosci, tabFCelu, liczbaWierszy, liczbaKolumn);
			rozwiazanieTextArea.append(f.simpTable(liczbaWierszy+2, liczbaWierszy+liczbaKolumn+2));
			
			//gauss.oblicz(tabelaTransponowana, liczbaWierszy);
		}
	}

	
	
}
}
